import re

# 字符匹配
rs = re.findall('abc', 'abc')
print(type(rs), rs)  # <class 'list'> ['abc']

# 使用.匹配除换行符以外的符号
rs = re.findall('a.c', 'aac')
print(rs)  # ['aac']

# 使用转义字符匹配特殊字符
rs = re.findall('a\.c', 'a.c')  # 只匹配a.c
print(rs)  # ['a.c']
rs = re.findall('a\.c', 'abc')  # abc无法匹配
print(rs)  # []

# 使用中括号指定匹配内容
rs = re.findall('a[bc]d', 'acd')
print(rs)  # ['acd']
rs = re.findall('a[bc]d', 'aed')
print(rs)  # []
# 也可用-指定范围
rs = re.findall('a[b-h]c', 'agc')
print(rs)  # ['agc']
# 使用^排除指定范围
rs = re.findall('a[^xyz]v', 'akv')
print(rs)  # ['akv']

# 预定字符集
'''
\d  数字:[0-9]
\D  非数字:[^\d]
\s  空白字符:[ \t\r\n\f\v]
\S  非空白字符:[^\s]
\w  单词字符:[A-Za-z0-9_]  中文也可以
\W  非单词字符:[^\w]
'''
# 数量词
'''
*  匹配前一个字符0到无数次  abc*可以匹配ab、abcccc
+  匹配前一个字符1到无数次
?  匹配前一个字符0或1次
{m}  匹配前一个字符m次
'''

# flag参数的使用 指定匹配模式
rs = re.findall('a.bc', 'a\nbc')
print(rs)  # []
rs = re.findall('a.bc', 'a\nbc', re.DOTALL)  # 或者re.S
print(rs)  # ['a\nbc']

# 分组的使用
rs = re.findall('a.+bc', 'a\nbc', re.DOTALL)
print(rs)  # ['a\nbc']
# 只会返回括号里的匹配内容
rs = re.findall('a(.+)bc', 'a\nbc', re.DOTALL)
print(rs)  # ['\n']

# r原串的使用
# 在正则中消除转义字符的影响
rs = re.findall('a\\nbc', 'a\\nbc')
print(rs)  # []
rs = re.findall(r'a\\nbc', 'a\\nbc')
print(rs)  # ['a\\nbc']
# 可以解决写正则时不符合PEP8规范的问题 (上面的警告)
rs = re.findall(r'\d', 'a789')
print(rs)  # ['7', '8', '9']
